//package com.cli.springboottemplateengine.engine.analyze;
//
//import org.springframework.expression.Expression;
//import org.springframework.expression.spel.SpelParserConfiguration;
//import org.springframework.expression.spel.standard.SpelExpressionParser;
//import org.springframework.expression.spel.ast.SpelNode;
//
//import java.util.*;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//public class ThymeleafVariableAnalyzer implements TemplateVariableAnalyzer {
//
//    private static final Pattern EXPRESSION_PATTERN = Pattern.compile(
//            "\\$\\{([^}]+)}|\\[\\(\\$\\{([^}]+)}\\)\\]"
//    );
//
//    @Override
//    public Set<String> extractVariables(String templateContent) {
//        Set<String> variables = new LinkedHashSet<>();
//        Matcher matcher = EXPRESSION_PATTERN.matcher(templateContent);
//        SpelExpressionParser parser = new SpelExpressionParser(new SpelParserConfiguration(true, true));
//
//        while (matcher.find()) {
//            String expr = matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
//            try {
//                Expression springExpr = parser.parseExpression(expr);
//                SpelNode root = ((org.springframework.expression.spel.standard.SpelExpression) springExpr).getAST();
//                collectFromNode(root, variables, new LinkedList<>());
//            } catch (Exception e) {
//                // 解析失败忽略
//            }
//        }
//        return variables;
//    }
//
//    private void collectFromNode(SpelNode node, Set<String> vars, Deque<String> pathStack) {
//        if (node == null) return;
//
//        switch (node.getClass().getSimpleName()) {
//            case "PropertyOrFieldReference":
//                pathStack.push(node.toStringAST());
//                if (node.getChildCount() > 0) {
//                    collectFromNode(node.getChild(0), vars, pathStack);
//                } else {
//                    vars.add(joinPath(pathStack));
//                }
//                pathStack.pop();
//                break;
//            case "Indexer":
//            case "MethodReference":
//                collectFromNode(node.getChild(0), vars, pathStack);
//                break;
//            case "TernaryOperator":
//            case "OpAnd":
//            case "OpOr":
//                for (int i = 0; i < node.getChildCount(); i++) {
//                    collectFromNode(node.getChild(i), vars, pathStack);
//                }
//                break;
//            case "VariableReference":
//                vars.add(node.toStringAST());
//                break;
//            default:
//                for (int i = 0; i < node.getChildCount(); i++) {
//                    collectFromNode(node.getChild(i), vars, pathStack);
//                }
//                break;
//        }
//    }
//
//    private String joinPath(Deque<String> pathStack) {
//        List<String> list = new ArrayList<>(pathStack);
//        Collections.reverse(list);
//        return String.join(".", list);
//    }
//}
//
